[Spring] - SpringActionTagProcessor
๐ฌ ์ํฉ ์ค๋ช
๊ฐ๋จํ๊ฒ ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ ๋งคํํ๊ธฐ ์ํด @GetMapping
์ผ๋ก ์ฐ๊ฒฐํด์ค ๋ค,
LoginRequestDto
๋ฅผ model
์ ๋ด์ View
์ ๋ณด๋ด์ค ์ํ์์ ํด๋น ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
[THYMELEAF][http-nio-8080-exec-1] Exception processing template "login-form": An error happened during template parsing (template: "class path resource [templates/login-form.html]")
org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/login-form.html]")
Caused by: org.attoparser.ParseException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringActionTagProcessor' (template: "login-form" - line 30, col 31)
Caused by: org.thymeleaf.exceptions.TemplateProcessingException: Error during execution of processor 'org.thymeleaf.spring5.processor.SpringActionTagProcessor' (template: "login-form" - line 30, col 31)
Caused by: java.lang.IllegalStateException: Cannot create a session after the response has been committed
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "class path resource [templates/login-form.html]")] with root cause
๐ ๊ตฌํ ์ฝ๋
public class AccountController{
@GetMapping("/login")
public String login(Model model) {
model.addAttribute("loginRequest", new LoginRequest());
return "login-form";
}
}
<form class="..."
th:action="@{/login}" th:object="${loginRequest}" method="POST">
๐ ์์ธ ๋ถ์
์ฐ์ ์ฌ๋ฌ ๊ฐ๋ฅ์ฑ์ ๋ณด๊ธฐ ์ํด ํ์๋ฆฌํ ๊ตฌ๋ฌธ์ ์ง์๋ณด๊ธฐ๋ ํ๊ณ , form
์ ์๋ Attribute
๋ฅผ ๋ชจ๋ ์ง์๋ณด๊ธฐ๋ ํ๋ค.
์ด 2๊ฐ์ง์ ๊ฐ๋ฅ์ฑ์ ํ์ธํ๋ค.
-
method="POST"
๋ง ์ ๊ฑฐ -
th:action="@{/login}"
๋ง ์ ๊ฑฐ
๊ฒฐ๋ก ์ ์ผ๋ก th:action
์ ํตํด POST ์์ฒญ์ด ๋๋ ๋ถ๋ถ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
โ ํด๊ฒฐ ๊ณผ์
๊ตฌ๊ธ๋ง์ ํตํด ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ์ฐพ์๋ดค์ง๋ง, ๋๋ถ๋ถ์ ๊ธ๋ค์ th:object
, th:field
์ ๋ํ ์คํ ๋ฌธ์ ์๋ค.
๊ตญ๋ด ๋ธ๋ก๊ทธ๋ ์ปค๋ฎค๋ํฐ์์๋ ๋ต์ ์ฐพ์ ์ ์์ด์ StackOverFlow๋ก ํฅํ์๊ณ , ๋ต์ ์ฐพ์ ์ ์์๋ค.
public class SecurityConfig{
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
// ...
.sessionManagement(
session -> session
.sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
);
return http.build();
}
}
๋ก๊ทธ์ธ ๊ณผ์ ์ ํ์ธํ๊ธฐ ์ํด ์์๋ก session
์ ๋ ๋ฆฐ ์ ์ด ์๋๋ฐ, ํด๋น ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ์๊ธด ๊ฒ ๊ฐ๋ค.
์ฐ์ ์์ ๊ฐ์ด ์ธ์
์ด ์๋ค๋ฉด ์ธ์
์ ์์ฑํด์ฃผ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ ๋ค ๋์ค์ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ฐพ์ผ๋ฉด ๊ทธ ๋ ์ ๊ฑฐํด๋ ๋ ๊ฒ ๊ฐ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ